import Footer from '@/components/Footer';
import RightContent from '@/components/RightContent';
import UnAccessiblePage from '@/pages/403';
import type { ResponseData } from '@/utils/request';
import sessionManager from '@/utils/session-manager';
import type { RequestConfig } from '@@/plugin-request/request';
import type { Settings as LayoutSettings } from '@ant-design/pro-layout';
import { PageLoading } from '@ant-design/pro-layout';
import { notification } from 'antd';
import type { RunTimeLayoutConfig } from 'umi';
import { history } from 'umi';
import type { RequestInterceptor, RequestOptionsInit, ResponseInterceptor } from 'umi-request';
import { currentUser as queryCurrentUser } from './services/ant-design-pro/api';

const loginPath = '/user/login';

/** 获取用户信息比较慢的时候会展示一个 loading */
export const initialStateConfig = {
  loading: <PageLoading />,
};

/**
 * @see  https://umijs.org/zh-CN/plugins/plugin-initial-state
 * */
export async function getInitialState(): Promise<{
  settings?: Partial<LayoutSettings>;
  currentUser?: API.CurrentUser;
  fetchUserInfo?: () => Promise<API.CurrentUser | undefined>;
}> {
  const fetchUserInfo = async () => {
    try {
      return await queryCurrentUser();
    } catch (error) {
      history.push(loginPath);
    }
    return undefined;
  };
  // 如果是登录页面，不执行
  if (history.location.pathname !== loginPath) {
    const currentUser = await fetchUserInfo();
    return {
      fetchUserInfo,
      currentUser,
      settings: {},
    };
  }
  return {
    fetchUserInfo,
    settings: {},
  };
}

const authHeaderInterceptor: RequestInterceptor = (url: string, options: RequestOptionsInit) => {
  const token = sessionManager().get();
  return {
    url: url,
    options: {
      ...options,
      interceptors: true,
      headers: url.includes('/login/account')
        ? options.headers
        : { ...options.headers, Authorization: `Bearer ${token || ''}` },
    },
  };
};

const tokenResponseInterceptor = async (response: Response) => {
  // 如果是登录页面，获取授权token
  if (response.url.includes('/login/account')) {
    const res: Response = response.clone();
    const responseData: ResponseData<{ accessToken: string }> = await res.json();
    const accessToken = responseData.data?.accessToken;
    const tokenValue = accessToken?.replace('Bearer ', '') || '';
    sessionManager().set(tokenValue);
  }
  return response;
};

const unAuthorizationInterceptor: ResponseInterceptor = (response: Response) => {
  if (response.status === 401) {
    notification.error({
      message: 'Login expired',
      description: '登录账号已过期,请重新登录',
      key: 'Unauthorized',
    });
    // const queryString = stringify({
    //   redirect: window.location.href,
    // });
    // console.log('queryString', queryString);
    setTimeout(() => {
      history.push(`/user/login`);
    }, 300);
    return response;
  }
  return response;
};

/**
 * 异常处理程序
 200: '服务器成功返回请求的数据。',
 201: '新建或修改数据成功。',
 202: '一个请求已经进入后台排队（异步任务）。',
 204: '删除数据成功。',
 400: '发出的请求有错误，服务器没有进行新建或修改数据的操作。',
 401: '用户没有权限（令牌、用户名、密码错误）。',
 403: '用户得到授权，但是访问是被禁止的。',
 404: '发出的请求针对的是不存在的记录，服务器没有进行操作。',
 405: '请求方法不被允许。',
 406: '请求的格式不可得。',
 410: '请求的资源被永久删除，且不会再得到的。',
 422: '当创建一个对象时，发生一个验证错误。',
 500: '服务器发生错误，请检查服务器。',
 502: '网关错误。',
 503: '服务不可用，服务器暂时过载或维护。',
 504: '网关超时。',
 //-----English
 200: The server successfully returned the requested data. ',
 201: New or modified data is successful. ',
 202: A request has entered the background queue (asynchronous task). ',
 204: Data deleted successfully. ',
 400: 'There was an error in the request sent, and the server did not create or modify data. ',
 401: The user does not have permission (token, username, password error). ',
 403: The user is authorized, but access is forbidden. ',
 404: The request sent was for a record that did not exist. ',
 405: The request method is not allowed. ',
 406: The requested format is not available. ',
 410':'The requested resource is permanently deleted and will no longer be available. ',
 422: When creating an object, a validation error occurred. ',
 500: An error occurred on the server, please check the server. ',
 502: Gateway error. ',
 503: The service is unavailable. ',
 504: The gateway timed out. ',
 * @see https://beta-pro.ant.design/docs/request-cn
 */
export const request: RequestConfig = {
  errorHandler: (error: any) => {
    const { response } = error;

    if (!response) {
      notification.error({
        description: '您的网络发生异常，无法连接服务器',
        message: '网络异常',
      });
    }
    throw error;
  },
  prefix: '/api',
  requestInterceptors: [authHeaderInterceptor],
  responseInterceptors: [tokenResponseInterceptor, unAuthorizationInterceptor],
};

// ProLayout 支持的api https://procomponents.ant.design/components/layout
export const layout: RunTimeLayoutConfig = ({ initialState }) => {
  return {
    rightContentRender: () => <RightContent />,
    // headerContentRender: () => <RightContent/>,
    disableContentMargin: false,
    footerRender: () => <Footer />,
    onPageChange: () => {
      const { location } = history;
      // 如果没有登录，重定向到 login
      if (!initialState?.currentUser && location.pathname !== loginPath) {
        history.push(loginPath);
      }
    },
    links: [],
    menuHeaderRender: undefined,
    // 自定义 403 页面
    unAccessible: <UnAccessiblePage />,
    ...initialState?.settings,
  };
};
